package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.entity.GoodsTypeVo;
import com.atguigu.jxc.service.GoodsTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {
    @Autowired
    private GoodsTypeDao goodsTypeDao;

    @Override
    public GoodsTypeVo selectAll() {
        List<GoodsType> queryList = goodsTypeDao.getAll();
        if (null != queryList && queryList.size() > 0) {
            GoodsTypeVo root = new GoodsTypeVo();
            for (GoodsType goodsType : queryList) {
                if (goodsType.getPId() == -1) {
                    root = change(goodsType);
                    break;
                }
            }
            return addChildren(root, queryList);
        }
        return null;
    }

    /**
     * 新增分类
     *
     * @param goodsTypeName 分类名
     * @param pId           父类id
     */
    @Override
    @Transactional
    public void save(String goodsTypeName, Integer pId) {
        GoodsType goodsType = new GoodsType();
        goodsType.setGoodsTypeName(goodsTypeName);
        goodsType.setGoodsTypeState(0);
        goodsType.setPId(pId);
        goodsTypeDao.save(goodsType);
        goodsTypeDao.updateState(pId, 1);
    }

    @Override
    @Transactional
    public void delete(Integer goodsTypeId) {
        //获取商品分类的信息
        GoodsType goodsType = goodsTypeDao.getById(goodsTypeId);
        //获得父分类的id
        Integer pId = goodsType.getPId();
        List<GoodsType> hasChildren = goodsTypeDao.getByParentId(goodsTypeId);
        //如果不是叶子分类拒绝删除
        if (hasChildren != null && hasChildren.size() != 0) {
            return;
        }

        // 删掉分类
        goodsTypeDao.delete(goodsTypeId);

        //判断父分类有没有其他子分类
        List<GoodsType> list = goodsTypeDao.getByParentId(pId);
        //没有其他子分类就修改state
        if (list == null || list.size() < 1) {
            goodsTypeDao.updateState(pId, 0);
        }
    }

    /**
     * 循环添加子类型
     *
     * @param parent
     * @param goodsTypeList
     * @return
     */
    private GoodsTypeVo addChildren(GoodsTypeVo parent, List<GoodsType> goodsTypeList) {
        List<GoodsTypeVo> children = new ArrayList<>();
        for (GoodsType goodsType : goodsTypeList) {

            if (goodsType.getPId() == parent.getId()) {
                GoodsTypeVo typeVo = change(goodsType);
                if (goodsType.getGoodsTypeState() != 0) {
                    typeVo = addChildren(change(goodsType), goodsTypeList);
                }
                children.add(typeVo);

            }
        }
        parent.setChildren(children);
        return parent;
    }

    /**
     * 将GoodsType->GoodsTypeVo
     *
     * @param goodsType
     * @return
     */
    private GoodsTypeVo change(GoodsType goodsType) {
        GoodsTypeVo goodsTypeVo = new GoodsTypeVo();
        goodsTypeVo.setId(goodsType.getGoodsTypeId());
        goodsTypeVo.setText(goodsType.getGoodsTypeName());
        goodsTypeVo.setState(goodsType.getGoodsTypeId());
        HashMap<String, Object> map = new HashMap<>();
        map.put("state", goodsType.getGoodsTypeState());
        goodsTypeVo.setAttributes(map);
        return goodsTypeVo;
    }
}
